package com.zwh.algorithm.foundation;


import com.zwh.tool.utils.NumUtils;

/**
 * 冲浪时偶尔看到的比较特别的算法就放这里参考一下
 *
 * @author yexi
 */
public class Collect {
    public static void main(String[] args) {
        //取绝对值
        int n = -45;
        System.out.println((n ^ (n >> 31)) - (n >> 31));
        System.out.println(n >> 31 == 0 ? n : (~n + 1));
        //判断是否是相反数
        int m = 45;
        System.out.println(((n ^ m) < 0));

        //加密存储：给定一个日、月、年数组，无论其给定顺序如何，都能转换成对应的二进制数字
        //举例：月份共12月,无论该数组是怎样的顺序,均能转换成一样的二进制数字
        StringBuilder binaryString = new StringBuilder();
        String[] array = "10,1,2,3,4,5,6,7,8,9,12".split(",");
        for (int i = 0; i < NumUtils.changeToSeveralPowersOfTwo(array.length); i++) {
            binaryString.append("0");
        }
        for (String monthValue : array) {
            //无论顺序如何，将其当做索引来使用
            int index = Integer.parseInt(monthValue);
            //替换字符数组对应索引位上的数字
            binaryString.replace(index - 1, index, "1");
        }
        //由于使用的索引是从左边开始的，但二进制的位是从右往前的，所以需要反转
        String binary = binaryString.reverse().toString();
        //使用2进制解析
        System.out.println(Integer.parseInt(binary, 2));

    }
}
